﻿/*************************************
 * Creator:SunnyPaine
 * DateTime:2022/8/22 15:21:52
 * Description:<Description>
 * CopyRight:
 * ***********************************/

using SqlSugar;
using SunnyPaine.Autofac.Extension.SqlSugar.Util;
using System.Collections.Generic;
using System.Data;

namespace SunnyPaine.Autofac.Extension.SqlSugar.Repository
{
    /// <summary>
    /// 提供 SqlSugar 基础的公共操作。
    /// </summary>
    /// <typeparam name="T">数据实体类型。</typeparam>
    public abstract class BaseSqlSugar<T> : SimpleClient<T>, IBaseSqlSugar<T> where T : class, new()
    {
        #region 私有变量
        private readonly PropertyInfoParser<T> parser;
        #endregion


        #region 构造方法
        /// <summary>
        /// 使用指定的参数创建 <see cref="BaseSqlSugar{T}"/> 的实例。
        /// </summary>
        /// <param name="context">ISqlSugarClient的实例。</param>
        public BaseSqlSugar(ISqlSugarClient context = null) : base(context)
        {
            this.parser = new PropertyInfoParser<T>();
        }
        #endregion


        #region 公共方法，IBaseSqlSugar成员
        /// <summary>
        /// 获取基础的 Select 操作。
        /// </summary>
        /// <returns></returns>
        public ISugarQueryable<T> Selector()
        {
            return base.Context.Queryable<T>();
        }
        #endregion

        #region 公共方法
        /// <summary>
        /// 查询所有
        /// </summary>
        /// <returns></returns>
        public virtual List<T> SelectAll()
        {
            return this.Selector().ToList();
        }

        /// <summary>
        /// 查询指定数据。
        /// </summary>
        /// <param name="id">主键。</param>
        /// <returns></returns>
        public virtual T SelectById(object id)
        {
            return this.Selector().InSingle(id);
        }

        /// <summary>
        /// 修改数据。
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public virtual bool UpdateById(T entity)
        {
            return base.Update(entity);
        }
        #endregion

        #region 公共方法，SQL语句执行
        /// <summary>
        /// 使用SQL语句查询。
        /// </summary>
        /// <param name="sql">sql语句。</param>
        /// <param name="parameters">参数。</param>
        /// <returns></returns>
        public virtual List<T> SelectBySql(string sql, object parameters)
        {
            DataTable dt = base.Context.Ado.GetDataTable(sql, parameters);
            return this.parser.DataTable2List(dt);
        }

        /// <summary>
        /// 使用SQL语句查询
        /// </summary>
        /// <param name="sql">sql语句。</param>
        /// <param name="parameters">参数列表。</param>
        /// <returns></returns>
        public virtual List<T> SelectBySql(string sql, List<SugarParameter> parameters)
        {
            DataTable dt = base.Context.Ado.GetDataTable(sql, parameters);
            return this.parser.DataTable2List(dt);
        }

        /// <summary>
        /// 使用SQL语句查询。
        /// </summary>
        /// <param name="sql">sql语句。</param>
        /// <param name="parameters">可变长参数列表。</param>
        /// <returns></returns>
        public virtual List<T> SelectBySql(string sql, params SugarParameter[] parameters)
        {
            DataTable dt = base.Context.Ado.GetDataTable(sql, parameters);
            return this.parser.DataTable2List(dt);
        }
        #endregion
    }
}
